package myown

import java.util.*

/**
 * ClassName:CActuator
 * Package:com.baidun.jbcs.interator
 * @see CIterator
 * Description:
 * 一个迭代执行器
 * 按照队列顺序执行
 * 添加监听器,取消或者暂停执行序列
 *
 * @date: 2021/8/10 9:35
 * @author: Wang Wanquan
 * @mail WongWonquanMail@gmail.com
 */
open class CActuator<T>(private val params:T) {

    /**
     * 迭代器执行器
     */
    private val mIteratorList: LinkedList<CIterator<T>> = LinkedList()

    private var result: ExecuteResult = ExecuteResult.UnStart
    private var message:String=""


    /**
     * 初始化参数
     */
    open fun init(t:T){
    }

    open fun onCleared(){
        mIteratorList.clear()
    }

    fun next(iterator: CIterator<T>): CActuator<T> {
        mIteratorList.add(iterator)
        return this
    }

    /**
     * 迭代执行器
     */
    fun proceed(resultListener: ResultListener?=null){
        init(params)
        val iterator = mIteratorList.iterator()
        when{
            //如果有迭代器缓存,就继续执行
            iterator.hasNext()->{
                val cIterator=iterator.next()
                iterator.remove()
                cIterator.init(params)
                cIterator.execute(params)
                //保存执行结果
                this.result=cIterator.executeResult
                this.message=cIterator.message
                //根据执行结果,决定流程流向
                when(result){
                    ExecuteResult.Success ->{
                        //进入下一个迭代器
                        proceed(resultListener)
                    }
                    else->{
                        //清空剩余的迭代器
                        onCleared()
                        //进入下一次迭代,直接进入结果判定
                        proceed(resultListener)
                    }
                }
            }
            //说明执行成功结束
            else->{
                //结束执行器执行
                onCleared()
                //根据结果回调
                when(result){
                    ExecuteResult.Success ->{
                        resultListener?.onSuccess()
                    }
                    ExecuteResult.UnStart, ExecuteResult.Failed ->{
                        resultListener?.onFail()
                    }
                    ExecuteResult.Canceled ->{
                        resultListener?.onCancel()
                    }
                }
            }
        }


    }


    interface ResultListener{
        fun onSuccess()
        fun onFail()
        fun onCancel()
    }

}

